package concurrent.c_000_Thread;

import util.ThreadUtil;

/**
 * https://www.cnblogs.com/jhxxb/p/10864125.html
 */
public class T03_Sleep_Yield_Join {
    public static void main(String[] args) {
        testSleep();
        // testYield();
        // testJoin();
    }

    static void testSleep() {
        // 会让当前线程进入等待状态。唤醒后都需要等待 CPU 资源，不一定会立即执行。
        // 若在等待期间被调用此线程的的 interrupt() 方法，将会产生 InterruptedException 异常。
        // sleep() 是 Thread 类的静态方法，会让出 CPU 资源。可以使低优先级的线程得到执行的机会。
        new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                System.out.println("A" + i);
                ThreadUtil.sleepMillis(500);
            }
        }).start();
    }

    static void testYield() {
        // yield() 是 Thread 类的静态原生 (native) 方法，作用是让出 CPU 资源，不会阻塞当前线程
        // 但可能让出 CPU 资源后，系统重新调度后又会选择给该线程 CPU 资源。使用场景比较少。
        new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                System.out.println("A" + i);
                if (i % 10 == 0) {
                    Thread.yield();
                }
            }
        }).start();

        new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                System.out.println("------------B" + i);
                if (i % 10 == 0) {
                    Thread.yield();
                }
            }
        }).start();
    }

    static void testJoin() {
        // join() 是 Thread 类实例的方法，可以使得一个线程在另一个线程结束后再执行。当前运行的线程将进入到等待状态直到另一个线程执行完成。
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                System.out.println("A" + i);
                ThreadUtil.sleepMillis(500);
            }
        });

        Thread t2 = new Thread(() -> {
            ThreadUtil.join(t1);
            for (int i = 0; i < 100; i++) {
                System.out.println("A" + i);
                ThreadUtil.sleepMillis(500);
            }
        });

        t1.start();
        t2.start();
    }
}
